#include "lib.h"
#include "serial.h"

/* Prototyp für den Kontext-Switch-Algorithmus aus process.c */
void do_context_switch();

/* Kernelseitige Implementierung von printf
 * Da wir uns die Zeíchenkette schon auf der User-Prozessseite zusammengebaut
 * haben, reicht hier ein einfaches write, um diese darzustellen */
static void
service_write(unsigned int num, char* str)
{
    write(str);
}

/* WICHTIG: Tabelle mit allen möglichen Systemaufrufen und ihre Funktionszeiger.
 * Reihenfolge ist identisch mit syscall_num_t aus syscalls.h */
void* service_table[] =
{
    do_context_switch,      // yield
    service_write,          // printf
};


/* Funktionsvorlage, die alle kernelseitigen Systemaufrufimplementierungen benutzen müssen,
 * unabhängig davon, ob sie alle drei zusätzlichen Parameter benutzen oder nicht */
typedef unsigned int (*tmp_syscall_t)(  unsigned int num,
                                        unsigned int param1,
                                        unsigned int param2,
                                        unsigned int param3);



/* do_service kümmert sich um das Zuordnen von Systemaufruf-IDs, wie sie in syscall_num_t
 * zu finden sind, zu eigentlichen Funktionen aufgelistet in service_table */
unsigned int do_service(unsigned int num,
        unsigned int param1,
        unsigned int param2,
        unsigned int param3)
{
    return ((tmp_syscall_t)service_table[num])(num, param1, param2, param3);
}


